//
//  main.c
//  wangzuo3-28-1
//
//  Created by mac on 16-3-28.
//  Copyright (c) 2016年 wangzuo. All rights reserved.
//

#include <stdio.h>
#include "stdlib.h"
//要初始化链队列，需要两个结点结构体

//数据结点
typedef struct Qnode
{
    int data;//数据保存
    struct Qnode * next;//保存下一个结点地址的指针
}QNode;

//结点指针
typedef struct link_queue
{
    QNode* front,*rear;//队首，队尾指针
}Link_Queue;

//链队列的初始化操作
Link_Queue * Init_LinkQueue()
{
    Link_Queue *Q;
    QNode * p;
    //数据结点p分配空间
    p=(QNode *)malloc(sizeof(QNode));//开辟一个头结点
    p->next=NULL;
    //开辟链队列的指针结点
    Q=(Link_Queue*)malloc(sizeof(Link_Queue));
    //将链队列置空
    Q->front=Q->rear=p;
    return Q;
}

//链队列的入队操作
//在已知队列的队尾插入一个元素e，然后修改队尾指针（Q.rear）
void Insert_CirQueue(Link_Queue * Q,int e)
{
    QNode *p=(QNode *)malloc(sizeof(QNode));
    if(!p)
    {
        printf("结点内存分配失败\n");
        return;
    }
    //将新插入的数据e赋值给新结点p的数据域
    p->data=e;
    p->next=NULL;
    //将新结点插入队尾
    Q->rear->next=p;
    Q->rear=p;
}

//出队操作，从队首删除一个元素，将删除的元素保存到变量x中
void Delet_LinkQueue(Link_Queue Q,int x)
{
    QNode * p;
    //判断链队列是否为空
    if(Q.front==Q.rear)
    {
        printf("队列为空\n");
        return;
    }
    //取得队首的结点
    p=Q.front->next;
    //将队首结点的数据取出来赋值给x
    x=p->data;
    //修改队首指针
    Q.front->next=p->next;
    //防止队尾指针的丢失
    if (Q.rear==p)
    {
        //删除到了队的最后一个元素，要将链队列置空
        Q.rear=Q.front;
    }
    //释放已经用完的数据结点的空间
    free(p);
}
|

int main(int argc, const char * argv[])
{
    Link_Queue *Q=Init_LinkQueue();
    Insert_CirQueue(Q, 56);
    Insert_CirQueue(Q, 89);
    Insert_CirQueue(Q, 92);
    int x=0;
    Delet_LinkQueue(*Q, x);
    printf("x=%d",x);
    return 0;
}

